import java.util.*;

public class Monticulo implements IMonticulo {
   
    private Vector<Comparable> monticulo = new Vector<Comparable>();
    
    public Monticulo(Comparable [] v) {
	for(int i = 0; i < v.length; i++) 
	    monticulo.add(v[i]);
        
	for (int i = v.length/2; i>=0; i--)
	    afundir(i);
    }

    public Comparable obtenerMenor(){
	if (monticulo.size() > 0)
	    return monticulo.firstElement();
	else
	    return null;
    }

    public void eliminarMenor() {
	// Hai que comprobar que o monticulo non estea baleiro
	monticulo.set(0, monticulo.lastElement());
	monticulo.remove( monticulo.size()-1 );
        if(monticulo.size() > 1) 
            this.afundir(0);
        
    }

    private void afundir(int index) {
	int i = index;
	int aux = 0;
	do {
	    int filloEsq = 2*(i+1)-1, filloDer = 2*(i+1);
	    aux = i;
	    
	    if(filloDer < monticulo.size() && 
	       monticulo.elementAt(filloDer).esMenorQue(monticulo.elementAt(i))) {
		i = filloDer;
	    }

	    if(filloEsq < monticulo.size() && 
	       monticulo.elementAt(filloEsq).esMenorQue(monticulo.elementAt(i))) {
		i = filloEsq;
	    }
	    
	    intercambiar(aux, i);
	} while(aux!=i);
    }

    private void intercambiar(int i, int j) {
        if(i==j) return;
	Comparable tmp = monticulo.elementAt(i);
	monticulo.set(i, monticulo.elementAt(j));
	monticulo.set(j, tmp);
    }

}